package cn.tedu.csmall.all.adapter.service.impl;

import cn.tedu.csmall.all.service.IBusinessService;
import cn.tedu.csmall.commons.exception.CoolSharkServiceException;
import cn.tedu.csmall.commons.pojo.order.dto.OrderAddDTO;
import cn.tedu.csmall.commons.restful.ResponseCode;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.client.producer.SendResult;
import org.springframework.messaging.Message;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.stereotype.Service;


@Service
@Slf4j
public class BusinessServiceImpl  implements IBusinessService {
    @Autowired(required = false)
    private RocketMQTemplate rocketMQTemplate;

    /* @DubboReference(loadbalance = "roundrobin") //loadbalance = "roundrobin"是局部dubbo负载均衡设置(全局负载均衡,需要在yaml中设置)
    //当前business模块作为客户端调用服务提供者采用的负载均衡策略是轮训机制roundrobin(挨个访问每个服务提供者)
    //@Autowired(required=false)//用了 @DubboReference就不再需要@Autowired了(因为模块之间就不需要依赖了)
    // @DubboReference和spring的注解@Autowired不冲突，不删除也可以(可以同时存在)
    //不过用@DubboReference引用IOrderService的代码也不是很好的解决方案，因为业务代码有侵入性(business中包含了order模块的代码)
    //所以后期改用消息队列方法调用更合适
    private IOrderService dubboOrderService;*/

    public void buy() {
        // 模拟触发购买业务
        // 先实例化一个用于新增订单的DTO
        OrderAddDTO orderAddDTO=new OrderAddDTO();
        orderAddDTO.setUserId("UU100");
        orderAddDTO.setCommodityCode("PC100");
        //订单，快照
        orderAddDTO.setMoney(100);
        orderAddDTO.setCount(2);
        // 暂时只能进行输出,后期有微服务支持可以调用其他模块
        log.info("新增订单信息为:{}",orderAddDTO);
        // dubbo调用order模块新增订单的方法
        // 将上面实例化的orderAddDTO当做参数,让它在数据库中生效
        /*dubboOrderService.orderAdd(orderAddDTO);*/
        //替换成异步生单逻辑 发送订单新增的消息
        //消息的携带信息,消息的封装特点. 消息一定要精简(足够小的占用空间)准确(足够用处理业务逻辑)
        Message message= MessageBuilder.withPayload(orderAddDTO).build();
        SendResult sendResult=rocketMQTemplate.syncSend("business-order-topic:orderAdd",message);
        if(!sendResult.getSendStatus().toString().equals("SEND_OK")){
            throw new CoolSharkServiceException(ResponseCode.BAD_REQUEST,"订单消息发送失败");
        }



    }
}
